home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / modchk.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  20.8 KB  |  632 lines

  1.       subroutine modchk
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine performs one-time processing of device model para-
  5. c meters and prints out a device model summary.  it also reserves the
  6. c additional nodes required by nonzero device extrinsic resistances.
  7. c
  8. c spice version 2g.6  sccsid=tabinf 3/15/83
  9.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  10.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  11.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  12.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  13.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  14.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  15.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  16.      7   irowno,jcolno,nttbr,nttar,lvntmp
  17. c spice version 2g.6  sccsid=miscel 3/15/83
  18.       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
  19.      1  defas,rstats(50),iwidth,lwidth,nopage
  20. c spice version 2g.6  sccsid=cirdat 3/15/83
  21.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  22.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  23. c spice version 2g.6  sccsid=status 3/15/83
  24.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  25.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  26.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  27. c spice version 2g.6  sccsid=flags 3/15/83
  28.       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
  29.      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,itl6,igoof,nogo,keof
  30. c spice version 2g.6  sccsid=knstnt 3/15/83
  31.       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
  32.      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox,
  33.      2   pivtol,pivrel
  34. c spice version 2g.6  sccsid=blank 3/15/83
  35.       common /blank/ value(200000)
  36.       integer nodplc(64)
  37.       complex cvalue(32)
  38.       equivalence (value(1),nodplc(1),cvalue(1))
  39. c
  40. c
  41.       dimension itab(50),atable(12)
  42.       dimension cpar(2),btable(12)
  43.       dimension antype(4),aptype(4)
  44.       dimension ipar(5),ampar(115),defval(115),ifmt(115),ivchk(115)
  45.       dimension titled(4),titleb(4),titlej(4),titlem(4)
  46.       data titled / 8hdiode mo, 8hdel para, 8hmeters  , 8h         /
  47.       data titleb / 8hbjt mode, 8hl parame, 8hters    , 8h         /
  48.       data titlej / 8hjfet mod, 8hel param, 8heters   , 8h         /
  49.       data titlem / 8hmosfet m, 8hodel par, 8hameters , 8h         /
  50.       data antype /1h ,3hnpn,3hnjf,4hnmos/
  51.       data aptype /1h ,3hpnp,3hpjf,4hpmos/
  52.       data ipar /0,14,60,72,114/
  53.       data cpar / 3hc2 ,3hc4 /
  54.       data aundef /2h.u/
  55.       data ampar /
  56.      1   6his    ,6hrs    ,6hn     ,6htt    ,6hcjo   ,6hvj    ,6hm     ,
  57.      2   6heg    ,6hxti   ,6hkf    ,6haf    ,6hfc    ,6hbv    ,6hibv   ,
  58.      1   6his    ,6hbf    ,6hnf    ,6hvaf   ,6hikf   ,6hise   ,6hne    ,
  59.      2   6hbr    ,6hnr    ,6hvar   ,6hikr   ,6hisc   ,6hnc    ,6h0     ,
  60.      3   6h0     ,6hrb    ,6hirb   ,6hrbm   ,6hre    ,6hrc    ,6hcje   ,
  61.      4   6hvje   ,6hmje   ,6htf    ,6hxtf   ,6hvtf   ,6hitf   ,6hptf   ,
  62.      5   6hcjc   ,6hvjc   ,6hmjc   ,6hxcjc  ,6htr    ,6h0     ,6h0     ,
  63.      6   6h0     ,6h0     ,6hcjs   ,6hvjs   ,6hmjs   ,6hxtb   ,6heg    ,
  64.      7   6hxti   ,6hkf    ,6haf    ,6hfc    ,
  65.      1   6hvto   ,6hbeta  ,6hlambda,6hrd    ,6hrs    ,6hcgs   ,6hcgd   ,
  66.      2   6hpb    ,6his    ,6hkf    ,6haf    ,6hfc    ,
  67.      1   6hlevel ,6hvto   ,6hkp    ,6hgamma ,6hphi   ,6hlambda,6hrd    ,
  68.      2   6hrs    ,6hcbd   ,6hcbs   ,6his    ,6hpb    ,6hcgso  ,6hcgdo  ,
  69.      3   6hcgbo  ,6hrsh   ,6hcj    ,6hmj    ,6hcjsw  ,6hmjsw  ,6hjs    ,
  70.      4   6htox   ,6hnsub  ,6hnss   ,6hnfs   ,6htpg   ,6hxj    ,6hld    ,
  71.      5   6huo    ,6hucrit ,6huexp  ,6hutra  ,6hvmax  ,6hneff  ,6hxqc   ,
  72.      6   6hkf    ,6haf    ,6hfc    ,6hdelta ,6htheta ,6heta   ,6hkappa ,
  73.      7   0.0d0   /
  74.       data defval /
  75.      1   1.0d-14,  0.0d0,  1.0d0,2*0.0d0,  1.0d0,  0.5d0, 1.11d0,
  76.      2     3.0d0,  0.0d0,  1.0d0,  0.5d0,  0.0d0, 1.0d-3,
  77.      1   1.0d-16,100.0d0,  1.0d0,3*0.0d0,  1.5d0,2*1.0d0,3*0.0d0,
  78.      2     2.0d0,  0.0d0,  1.0d0,6*0.0d0, 0.75d0, 0.33d0,2*0.0d0,
  79.      3   4*0.0d0, 0.75d0, 0.33d0,  1.0d0,6*0.0d0, 0.75d0,2*0.0d0,
  80.      4    1.11d0,  3.0d0,  0.0d0,  1.0d0,  0.5d0,
  81.      1    -2.0d0, 1.0d-4,5*0.0d0,  1.0d0,1.0d-14,  0.0d0,  1.0d0,
  82.      2     0.5d0,
  83.      1     1.0d0,  0.0d0, 2.0d-5,  0.0d0,  0.6d0,5*0.0d0,1.0d-14,
  84.      2     0.8d0,5*0.0d0,  0.5d0,  0.0d0, 0.33d0,5*0.0d0,  1.0d0,
  85.      3   2*0.0d0,600.0d0, 1.0d+4,3*0.0d0,  1.0d0,  1.0d0,  0.0d0,
  86.      4     1.0d0,  0.5d0,3*0.0d0,  0.2d0,
  87.      5     0.0d0/
  88.       data ifmt /
  89.      1   4,1,1,2,2,1,1,1,1,2,1,1,2,2,
  90.      2   4,3,3,2,2,2,1,3,3,2,2,2,1,0,0,1,2,1,1,1,2,1,1,2,2,2,2,1,2,1,
  91.      2   1,1,2,0,0,0,0,2,1,1,2,1,1,2,2,2,
  92.      3   3,4,1,1,1,2,2,1,2,2,1,1,
  93.      4   3,3,4,1,1,2,1,1,2,2,2,1,2,2,2,1,2,1,2,1,2,2,2,2,2,1,2,2,
  94.      4   1,2,1,1,2,1,1,2,1,1,1,1,1,1,
  95.      5   0/
  96.       data ivchk /
  97.      1   0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  98.      2   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  99.      2   0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,
  100.      3   -1,0,0,0,0,0,0,0,0,0,0,0,
  101.      4   0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,
  102.      4   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  103.      5   0/
  104. c
  105. c
  106.       tnom=value(itemps+1)+ctok
  107.       xkt=boltz*tnom
  108.       vt=xkt/charge
  109.       xni=1.45d16
  110.       egfet=1.16d0-(7.02d-4*tnom*tnom)/(tnom+1108.0d0)
  111.       nummod=jelcnt(21)+jelcnt(22)+jelcnt(23)+jelcnt(24)
  112.       if (nummod.eq.0) go to 1000
  113. c
  114. c  special preprocessing for mosfet models
  115. c
  116.       loc=locate(24)
  117.     5 if (loc.eq.0) go to 35
  118.       locv=nodplc(loc+1)
  119.       type=nodplc(loc+2)
  120. c
  121. c     default parameters for higher level mos models
  122. c
  123.       lev=value(locv+1)
  124.       if (value(locv+1).eq.aundef) lev=1
  125.       if (value(locv+23).ne.aundef) xnsub=value(locv+23)*1.0d6
  126.       if (value(locv+22).eq.aundef.and.lev.gt.1) value(locv+22)=1.0d-7
  127.       if (value(locv+22).eq.aundef) go to 33
  128.       cox=epsox/value(locv+22)
  129. c
  130. c     compute kp, if not input, using default mobility 600 cm**2/v*sec
  131. c
  132.       if (value(locv+3).ne.aundef) go to 10
  133.       if (value(locv+29).eq.aundef) value(locv+29)=600.0d0
  134.       value(locv+3)=value(locv+29)*cox*1.0d-4
  135.    10 if (value(locv+23).eq.aundef) go to 33
  136.       if (xnsub.le.xni) go to 30
  137. c
  138. c     nsub nonzero => process oriented model
  139. c
  140.       if (value(locv+5).eq.aundef) value(locv+5)=
  141.      1   dmax1((2.0d0*vt*dlog(xnsub/xni)),0.1d0)
  142.       fermis=type*0.5d0*value(locv+5)
  143.       wkfng=3.2d0
  144.       if (value(locv+26).eq.aundef) value(locv+26)=1.0d0
  145.       if (value(locv+26).eq.0.0d0) go to 15
  146. c
  147. c  polysilicon gate
  148. c
  149.       fermig=type*value(locv+26)*0.5d0*egfet
  150.       wkfng=3.25d0+0.5d0*egfet-fermig
  151.    15 wkfngs=wkfng-(3.25d0+0.5d0*egfet+fermis)
  152.       if (value(locv+4).eq.aundef)
  153.      1   value(locv+4)=dsqrt(2.0d0*epssil*charge*xnsub)/cox
  154. c
  155. c     computed vto
  156. c
  157.       if (value(locv+2).ne.aundef) go to 20
  158.       if (value(locv+24).eq.aundef) value(locv+24)=0.0d0
  159.       value(locv+44)=wkfngs-value(locv+24)*1.0d4*charge/cox
  160.       value(locv+2)=value(locv+44)
  161.      1   +type*(value(locv+4)*dsqrt(value(locv+5))+value(locv+5))
  162.       go to 25
  163. c
  164. c     measured vto has been input
  165. c
  166.    20 value(locv+44)=value(locv+2)
  167.      1   -type*(value(locv+4)*dsqrt(value(locv+5))+value(locv+5))
  168.    25 value(locv+45)=dsqrt((epssil+epssil)/(charge*xnsub))
  169.       go to 33
  170.    30 value(locv+23)=0.0d0
  171.       write (iofile,31) value(locv)
  172.    31 format('0*error*:  nsub <= ni in mosfet model ',a8,/)
  173.       nogo=1
  174. c
  175. c   special processing for mos3: limit kappa>0,
  176. c   set to zero lambda,ucrit,uexp and utar
  177. c
  178.    33 if (lev.ne.3) go to 34
  179.       if (value(locv+42).eq.aundef) value(locv+42)=0.2d0
  180.       value(locv+6)=0.0d0
  181.       value(locv+30)=0.0d0
  182.       value(locv+31)=0.0d0
  183.       value(locv+32)=0.0d0
  184.    34 loc=nodplc(loc)
  185.       go to 5
  186. c
  187. c     cycle thru devices
  188. c
  189.    35 kntlim=lwidth/11
  190.       do 390 id=1,4
  191.       if (jelcnt(id+20).eq.0) go to 390
  192.       locm=ipar(id)
  193.       nopar=ipar(id+1)-locm
  194.       do 45 i=1,nopar
  195.       if (ifmt(locm+i).ge.3) go to 40
  196.       itab(i)=0
  197.       go to 45
  198.    40 itab(i)=ifmt(locm+i)-2
  199.    45 continue
  200. c
  201. c  assign default values
  202. c
  203.       loc=locate(id+20)
  204.    50 if (loc.eq.0) go to 70
  205.       locv=nodplc(loc+1)
  206.       do 65 i=1,nopar
  207.       if (value(locv+i).eq.aundef) go to 62
  208.       if (ivchk(locm+i).lt.0) go to 55
  209.       if (value(locv+i).lt.0.0d0) go to 62
  210.    55 if (itab(i).ne.0) go to 65
  211.       itab(i)=ifmt(locm+i)
  212.       go to 65
  213.    62 value(locv+i)=defval(locm+i)
  214.    65 continue
  215.       loc=nodplc(loc)
  216.       go to 50
  217. c
  218. c     limit model values
  219. c
  220.    70 go to (80,85,90,95), id
  221. c...  diodes
  222.    80 loc=locate(21)
  223.    82 if (loc.eq.0) go to 130
  224.       locv=nodplc(loc+1)
  225.       value(locv+7)=dmin1(value(locv+7),0.9d0)
  226.       value(locv+8)=dmax1(value(locv+8),0.1d0)
  227.       value(locv+11)=dmax1(value(locv+11),0.1d0)
  228.       value(locv+12)=dmin1(value(locv+12),0.95d0)
  229.       loc=nodplc(loc)
  230.       go to 82
  231. c...  bipolar transistors
  232.    85 loc=locate(22)
  233.    87 if (loc.eq.0) go to 130
  234.       locv=nodplc(loc+1)
  235.       value(locv+23)=dmin1(value(locv+23),0.9d0)
  236.       if (value(locv+24).eq.0.0d0) value(locv+28)=0.0d0
  237.       value(locv+31)=dmin1(value(locv+31),0.9d0)
  238.       value(locv+32)=dmin1(value(locv+32),1.0d0)
  239.       value(locv+40)=dmin1(value(locv+40),0.9d0)
  240.       value(locv+42)=dmax1(value(locv+42),0.1d0)
  241.       value(locv+45)=dmax1(value(locv+45),0.1d0)
  242.       value(locv+46)=dmin1(value(locv+46),0.9999d0)
  243.       loc=nodplc(loc)
  244.       if (value(locv+18).eq.0.0d0) value(locv+18)=value(locv+16)
  245.       if (value(locv+16).ge.value(locv+18)) go to 87
  246.       write(iofile,89) value(locv)
  247.    89 format('0warning:  minimum base resistance (rbm) is less than '
  248.      1       ,'total (rb) for model ',a8,/10x,' rbm set equal to rb',/)
  249.       value(locv+18)=value(locv+16)
  250.       go to 87
  251. c...  jfets
  252.    90 loc=locate(23)
  253.    92 if (loc.eq.0) go to 130
  254.       locv=nodplc(loc+1)
  255.       value(locv+11)=dmax1(value(locv+11),0.1d0)
  256.       value(locv+12)=dmin1(value(locv+12),0.95d0)
  257.       loc=nodplc(loc)
  258.       go to 92
  259. c...  mosfets
  260.    95 loc=locate(24)
  261.    97 if (loc.eq.0) go to 130
  262.       locv=nodplc(loc+1)
  263. c
  264.   100 value(locv+37)=dmax1(value(locv+37),0.1d0)
  265.       value(locv+38)=dmin1(value(locv+38),0.95d0)
  266.       if (value(locv+23).le.0.0d0) go to 120
  267.       cj=dsqrt(epssil*charge*value(locv+23)*1.0d6/
  268.      1   (2.0d0*value(locv+12)))
  269.       if (value(locv+9).le.0.0d0) go to 105
  270.       itab(9)=2
  271.   105 if (value(locv+10).le.0.0d0) go to 110
  272.       itab(10)=2
  273.       go to 115
  274.   110 if (value(locv+17).le.0.0d0) value(locv+17)=cj
  275.       itab(17)=2
  276.   115 if ((value(locv+7).le.0.0d0).and.
  277.      1    (value(locv+8).le.0.0d0)) go to 120
  278.       itab(7)=2
  279.       itab(8)=2
  280.   120 if (value(locv+6).ge.0.2d0) write (iofile,121) value(locv)
  281.   121 format ('0warning:  the value of lambda for mosfet model ',a8,/,
  282.      1   ' is unusually large and might cause nonconvergence',/)
  283.       if (lev.ne.2) value(locv+35)=1.0d0
  284.       if (lev.ne.3) go to 125
  285.       itab(40)=1
  286.       itab(41)=1
  287.       itab(42)=1
  288.       itab(43)=1
  289.   125 loc=nodplc(loc)
  290.       go to 97
  291. c
  292. c     print model parameters
  293. c
  294.   130 if (iprntm.eq.0) go to 360
  295.       locs=locate(id+20)
  296.   140 kntr=0
  297.       loc=locs
  298.       go to (150,160,170,180), id
  299.   150 call title(0,lwidth,1,titled)
  300.       go to 200
  301.   160 call title(0,lwidth,1,titleb)
  302.       go to 200
  303.   170 call title(0,lwidth,1,titlej)
  304.       go to 200
  305.   180 call title(0,lwidth,1,titlem)
  306.   200 if (loc.eq.0) go to 210
  307.       if (kntr.lt.kntlim) go to 220
  308.   210 locn=loc
  309.       go to 240
  310.   220 kntr=kntr+1
  311.       locv=nodplc(loc+1)
  312.       atable(kntr)=value(locv)
  313.   230 loc=nodplc(loc)
  314.       go to 200
  315.   240 write (iofile,241) (atable(k),k=1,kntr)
  316.   241 format(//11x,12(2x,a8))
  317.       if (id.eq.1) go to 300
  318.       kntr=0
  319.       loc=locs
  320.   250 if (loc.eq.0) go to 260
  321.       if (kntr.ge.kntlim) go to 260
  322.       kntr=kntr+1
  323.       atable(kntr)=antype(id)
  324.       if (nodplc(loc+2).eq.-1) atable(kntr)=aptype(id)
  325.       loc=nodplc(loc)
  326.       go to 250
  327.   260 write (iofile,261) (atable(k),k=1,kntr)
  328.   261 format('0type',4x,12(4x,a6))
  329.   300 do 340 i=1,nopar
  330.       if (itab(i).eq.0) go to 340
  331.       kntr=0
  332.       iccflg=0
  333.       loc=locs
  334.   310 if (loc.eq.0) go to 320
  335.       if (kntr.ge.kntlim) go to 320
  336.       locv=nodplc(loc+1)
  337.       kntr=kntr+1
  338.       if (iccflg.ne.0) go to 313
  339.       if (id.ne.2) go to 315
  340.       if ((i.ne.6).and.(i.ne.12)) go to 315
  341.       if (value(locv+i).le.1.0d0) go to 315
  342.       iccflg=i/6
  343.   313 btable(kntr)=value(locv+i)
  344.       value(locv+i)=value(locv+i)*value(locv+1)
  345.   315 atable(kntr)=value(locv+i)
  346.       loc=nodplc(loc)
  347.       go to 310
  348.   320 if (itab(i).eq.2) go to 330
  349.       write (iofile,321) ampar(locm+i),(atable(k),k=1,kntr)
  350.   321 format(1h0,a8,12f10.3)
  351.       go to 340
  352.   330 write (iofile,331) ampar(locm+i),(atable(k),k=1,kntr)
  353.   331 format(1h0,a8,1p12d10.2)
  354.       if (iccflg.eq.0) go to 340
  355.       write (iofile,321) cpar(iccflg),(btable(k),k=1,kntr)
  356.   340 continue
  357.       if (locn.eq.0) go to 390
  358.       locs=locn
  359.       go to 140
  360. c
  361. c  special  treatment for c2 & c4 in the bjt model
  362. c  when no model parameter print
  363. c
  364.   360 if (id.ne.2) go to 390
  365.       loc=locate(id+20)
  366.   370 if (loc.eq.0) go to 390
  367.       locv=nodplc(loc+1)
  368.       if (value(locv+6).ge.1.0d0)
  369.      1   value(locv+6)=value(locv+6)*value(locv+1)
  370.       if (value(locv+12).ge.1.0d0)
  371.      1   value(locv+12)=value(locv+12)*value(locv+1)
  372.       loc=nodplc(loc)
  373.       go to 370
  374.   390 continue
  375. c
  376. c  process model parameters
  377. c
  378. c  diodes
  379. c
  380.   400 loc=locate(21)
  381.   410 if (loc.eq.0) go to 420
  382.       locv=nodplc(loc+1)
  383.       if (value(locv+2).ne.0.0d0) value(locv+2)=1.0d0/value(locv+2)
  384.       pb=value(locv+6)
  385.       xm=value(locv+7)
  386.       fc=value(locv+12)
  387.       value(locv+12)=fc*pb
  388.       xfc=dlog(1.0d0-fc)
  389.       value(locv+15)=pb*(1.0d0-dexp((1.0d0-xm)*xfc))/(1.0d0-xm)
  390.       value(locv+16)=dexp((1.0d0+xm)*xfc)
  391.       value(locv+17)=1.0d0-fc*(1.0d0+xm)
  392.       csat=value(locv+1)
  393.       vte=value(locv+3)*vt
  394.       value(locv+18)=vte*dlog(vte/(root2*csat))
  395.       bv=value(locv+13)
  396.       if (bv.eq.0) go to 418
  397.       cbv=value(locv+14)
  398.       if (cbv.ge.csat*bv/vt) go to 412
  399.       cbv=csat*bv/vt
  400.       write (iofile,411) value(locv),cbv
  401.   411 format('0warning:  in diode model ',a8,' ibv increased to ',1pe10.
  402.      1   3,11x,'to resolve incompatibility with specified is'/)
  403.       xbv=bv
  404.       go to 416
  405.   412 tol=reltol*cbv
  406.       xbv=bv-vt*dlog(1.0d0+cbv/csat)
  407.       iter=0
  408.   413 xbv=bv-vt*dlog(cbv/csat+1.0d0-xbv/vt)
  409.       xcbv=csat*(dexp((bv-xbv)/vt)-1.0d0+xbv/vt)
  410.       if (dabs(xcbv-cbv).le.tol) go to 416
  411.       iter=iter+1
  412.       if (iter.lt.25) go to 413
  413.       write (iofile,415) xbv,xcbv
  414.   415 format('0warning:  unable to match forward and reverse diode regio
  415.      1ns',/,11x,'bv = ',1pd10.3,' and ibv = ',d10.3,/)
  416.   416 value(locv+13)=xbv
  417.   418 loc=nodplc(loc)
  418.       go to 410
  419. c
  420. c  bipolar transistor models
  421. c
  422.   420 loc=locate(22)
  423.   430 if (loc.eq.0) go to 440
  424.       locv=nodplc(loc+1)
  425.       if (value(locv+4).ne.0.0d0) value(locv+4)=1.0d0/value(locv+4)
  426.       if (value(locv+5).ne.0.0d0) value(locv+5)=1.0d0/value(locv+5)
  427.       if (value(locv+10).ne.0.0d0) value(locv+10)=1.0d0/value(locv+10)
  428.       if (value(locv+11).ne.0.0d0) value(locv+11)=1.0d0/value(locv+11)
  429.       if (value(locv+19).ne.0.0d0) value(locv+19)=1.0d0/value(locv+19)
  430.       if (value(locv+20).ne.0.0d0) value(locv+20)=1.0d0/value(locv+20)
  431.       if (value(locv+26).ne.0.0d0) value(locv+26)=1.0d0/value(locv+26)
  432.      1   /1.44d0
  433.       value(locv+28)=value(locv+28)/rad*value(locv+24)
  434.       if (value(locv+35).ne.0.0d0) value(locv+35)=1.0d0/value(locv+35)
  435.      1   /1.44d0
  436.       pe=value(locv+22)
  437.       xme=value(locv+23)
  438.       pc=value(locv+30)
  439.       xmc=value(locv+31)
  440.       fc=value(locv+46)
  441.       value(locv+46)=fc*pe
  442.       xfc=dlog(1.0d0-fc)
  443.       value(locv+47)=pe*(1.0d0-dexp((1.0d0-xme)*xfc))/(1.0d0-xme)
  444.       value(locv+48)=dexp((1.0d0+xme)*xfc)
  445.       value(locv+49)=1.0d0-fc*(1.0d0+xme)
  446.       value(locv+50)=fc*pc
  447.       value(locv+51)=pc*(1.0d0-dexp((1.0d0-xmc)*xfc))/(1.0d0-xmc)
  448.       value(locv+52)=dexp((1.0d0+xmc)*xfc)
  449.       value(locv+53)=1.0d0-fc*(1.0d0+xmc)
  450.       csat=value(locv+1)
  451.       value(locv+54)=vt*dlog(vt/(root2*csat))
  452.       loc=nodplc(loc)
  453.       go to 430
  454. c
  455. c  jfet models
  456. c
  457.   440 loc=locate(23)
  458.   450 if (loc.eq.0) go to 460
  459.       locv=nodplc(loc+1)
  460.       if (value(locv+4).ne.0.0d0) value(locv+4)=1.0d0/value(locv+4)
  461.       if (value(locv+5).ne.0.0d0) value(locv+5)=1.0d0/value(locv+5)
  462.       pb=value(locv+8)
  463.       xm=0.5d0
  464.       fc=value(locv+12)
  465.       value(locv+12)=fc*pb
  466.       xfc=dlog(1.0d0-fc)
  467.       value(locv+13)=pb*(1.0d0-dexp((1.0d0-xm)*xfc))/(1.0d0-xm)
  468.       value(locv+14)=dexp((1.0d0+xm)*xfc)
  469.       value(locv+15)=1.0d0-fc*(1.0d0+xm)
  470.       csat=value(locv+9)
  471.       value(locv+16)=vt*dlog(vt/(root2*csat))
  472.       loc=nodplc(loc)
  473.       go to 450
  474. c
  475. c  mosfet models
  476. c
  477.   460 loc=locate(24)
  478.   470 if (loc.eq.0) go to 600
  479.       locv=nodplc(loc+1)
  480.       type=nodplc(loc+2)
  481.       if (value(locv+7).ne.0.0d0) value(locv+7)=1.0d0/value(locv+7)
  482.       if (value(locv+8).ne.0.0d0) value(locv+8)=1.0d0/value(locv+8)
  483.       if (value(locv+16).ne.0.0d0) value(locv+16)=1.0d0/value(locv+16)
  484.       value(locv+23)=value(locv+23)*1.0d6
  485.       value(locv+24)=value(locv+24)*1.0d4
  486.       value(locv+25)=value(locv+25)*1.0d4
  487.       if (value(locv+22).ne.0.0d0) value(locv+22)=epsox/value(locv+22)
  488.       value(locv+29)=value(locv+29)*1.0d-4
  489.       if (lev.eq.3) go to 472
  490.       value(locv+30)=value(locv+30)*1.0d2
  491.       go to 473
  492. c
  493. c   move mos3 parameters : theta from locations locv+40 to locv+30
  494. c                          eta                       41         31
  495. c                          kappa                     42         32
  496. c   and replace locv+6 by (xd)**2
  497. c
  498.   472 value(locv+39)=value(locv+39)
  499.      1   *0.25d0*twopi*epssil/value(locv+22)
  500.       value(locv+30)=value(locv+40)
  501.       value(locv+31)=value(locv+41)*8.15d-22/value(locv+22)
  502.       value(locv+32)=value(locv+42)
  503.       if (value(locv+23).gt.0.0d0)
  504.      1    value(locv+6)=(epssil+epssil)/(charge*value(locv+23))
  505. c
  506. c   noise parameters
  507. c
  508.   473 pb=value(locv+12)
  509.       xm=0.5d0
  510.       fc=value(locv+38)
  511.       value(locv+38)=fc*pb
  512.       xfc=dlog(1.0d0-fc)
  513.       value(locv+40)=pb*(1.0d0-dexp((1.0d0-xm)*xfc))/(1.0d0-xm)
  514.       value(locv+41)=dexp((1.0d0+xm)*xfc)
  515.       value(locv+42)=1.0d0-fc*(1.0d0+xm)
  516.       value(locv+43)=-1.0d0
  517.       value(locv+44)=value(locv+2)-
  518.      1   type*value(locv+4)*dsqrt(value(locv+5))
  519.   475 if (value(locv+22).ne.0.0d0.and.lev.ne.3)
  520.      1   value(locv+30)=value(locv+30)*epssil/value(locv+22)
  521.       loc=nodplc(loc)
  522.       go to 470
  523. c
  524. c  reserve additional nodes
  525. c
  526. c  diodes
  527. c
  528.   600 loc=locate(11)
  529.   610 if ((loc.eq.0).or.(nodplc(loc+16).ne.0)) go to 700
  530.       locm=nodplc(loc+5)
  531.       locm=nodplc(locm+1)
  532.       if (value(locm+2).eq.0.0d0) go to 620
  533.       numnod=numnod+1
  534.       nodplc(loc+4)=numnod
  535.       go to 630
  536.   620 nodplc(loc+4)=nodplc(loc+2)
  537.   630 loc=nodplc(loc)
  538.       go to 610
  539. c
  540. c  transistors
  541. c
  542.   700 loc=locate(12)
  543.   710 if ((loc.eq.0).or.(nodplc(loc+36).ne.0)) go to 800
  544.       nodplc(loc+30)=nodplc(loc+5)
  545.       locm=nodplc(loc+8)
  546.       locm=nodplc(locm+1)
  547.       if (value(locm+16).eq.0.0d0) go to 720
  548.       numnod=numnod+1
  549.       nodplc(loc+6)=numnod
  550.       go to 730
  551.   720 nodplc(loc+6)=nodplc(loc+3)
  552.   730 if (value(locm+20).eq.0.0d0) go to 740
  553.       numnod=numnod+1
  554.       nodplc(loc+5)=numnod
  555.       go to 750
  556.   740 nodplc(loc+5)=nodplc(loc+2)
  557.   750 if (value(locm+19).eq.0.0d0) go to 760
  558.       numnod=numnod+1
  559.       nodplc(loc+7)=numnod
  560.       go to 770
  561.   760 nodplc(loc+7)=nodplc(loc+4)
  562.   770 loc=nodplc(loc)
  563.       go to 710
  564. c
  565. c  jfets
  566. c
  567.   800 loc=locate(13)
  568.   810 if ((loc.eq.0).or.(nodplc(loc+25).ne.0)) go to 900
  569.       locm=nodplc(loc+7)
  570.       locm=nodplc(locm+1)
  571.       if (value(locm+4).eq.0.0d0) go to 820
  572.       numnod=numnod+1
  573.       nodplc(loc+5)=numnod
  574.       go to 830
  575.   820 nodplc(loc+5)=nodplc(loc+2)
  576.   830 if (value(locm+5).eq.0.0d0) go to 840
  577.       numnod=numnod+1
  578.       nodplc(loc+6)=numnod
  579.       go to 850
  580.   840 nodplc(loc+6)=nodplc(loc+4)
  581.   850 loc=nodplc(loc)
  582.       go to 810
  583. c
  584. c  mosfets
  585. c
  586.   900 loc=locate(14)
  587.   910 if (loc.eq.0) go to 1000
  588.       locm=nodplc(loc+8)
  589.       locm=nodplc(locm+1)
  590.       locv=nodplc(loc+1)
  591.       xleff=value(locv+1)-2.0d0*value(locm+28)
  592.       if (xleff.gt.0.0d0) go to 915
  593.       write(iofile,911) value(locv),value(locm)
  594.   911 format('0*error*:  effective channel length of ',a8,' less than ',
  595.      1   'zero.',/' check value of ld for model ',a8)
  596.       if (nodplc(loc+33).ne.0) go to 960
  597.   915 if ((value(locm+7).eq.0.0d0).and.
  598.      1    (value(locm+16).eq.0.0d0)) go to 920
  599.       numnod=numnod+1
  600.       nodplc(loc+6)=numnod
  601.       go to 930
  602.   920 nodplc(loc+6)=nodplc(loc+2)
  603.   930 if ((value(locm+8).eq.0.0d0).and.
  604.      1    (value(locm+16).eq.0.0d0)) go to 940
  605.       numnod=numnod+1
  606.       nodplc(loc+7)=numnod
  607.       go to 950
  608.   940 nodplc(loc+7)=nodplc(loc+4)
  609.   950 ad=value(locv+3)
  610.       as=value(locv+4)
  611.       if ((ad.le.0.0d0).or.(as.le.0.0d0)
  612.      1   .and.value(locm+11).le.0.0d0)
  613.      2   value(locm+11)=1.0d-14
  614.   960 loc=nodplc(loc)
  615.       go to 910
  616. c
  617. c  transmission lines
  618. c
  619.  1000 loc=locate(17)
  620.  1010 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) go to 2000
  621.       numnod=numnod+1
  622.       nodplc(loc+6)=numnod
  623.       numnod=numnod+1
  624.       nodplc(loc+7)=numnod
  625.       loc=nodplc(loc)
  626.       go to 1010
  627. c
  628. c  finished
  629. c
  630.  2000 return
  631.       end
  632.